home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 2
/
Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso
/
Aminet
/
dev
/
amos
/
3DAmosDemo.lha
/
3DSpaceships.amos
/
3DSpaceships.amosSourceCode
next >
Wrap
AMOS Source Code
|
1992-11-09
|
6KB
|
232 lines
'
' 3D graphics demo
' by Richard Ling.
'
PSIZE=8000 : DPH=200 : OBJNUM=8 : SHOTNUM=3 : BLTNUM=35
Dim OBJ(OBJNUM-1,13),SHOT(SHOTNUM-1,11),SPT(BLTNUM,1),SEQ(15)
Global DPH,PSIZE,OBJNUM,SHOTNUM,BLTNUM,NXTSHOT,SHOTDEL,GELS,LANDED
Global OBJ(),SHOT(),SPT(),SEQ()
Hide On : Degree
X Mouse=288 : Y Mouse=100
INITSCREENS
INITVARS
'
Do
Dec SHOTDEL
If Mouse Key and SHOTDEL<=0 Then INITSHOT[NXTSHOT]
For T=0 To SHOTNUM-1
If SHOT(T,0)=True
SDIS=SHOT(T,3)
For TH=0 To OBJNUM-1
If OBJ(TH,3)=SDIS and OBJ(TH,0)
Plot SHOT(T,6),SHOT(T,8),0 : O=OBJ(TH,8)
Paste Bob(OBJ(TH,5))/100-SPT(O,0),OBJ(TH,7)-SPT(O,1),O
If Point(SHOT(T,6),SHOT(T,8))>0
SHOT(T,0)=False : Boom : OBJ(TH,0)=1
End If
End If
Next TH
UDATESHOT[T]
End If
Next T
Copy BGA,BGB To SOURCEA
Copy BGB,BGC To SOURCEB
Copy BGC,BGD To SOURCEC
Copy BGD,BGE To SOURCED
For T=0 To OBJNUM-1
UDATEOBJ[T]
Next T
SEQUENCE
Screen 0 : Ink 3
For T=GELS-1 To 0 Step -1
GEL=SEQ(T) and $FF
If GEL>49
GEL=GEL-50
DRWOBJ[GEL,5]
Else
If SHOT(GEL,0)
Draw SHOT(GEL,6),SHOT(GEL,8) To SHOT(GEL,9),SHOT(GEL,11)
End If
End If
Next T
Screen 1 : Ink 3
For T=GELS-1 To 0 Step -1
GEL=SEQ(T) and $FF
If GEL>49
GEL=GEL-50
DRWOBJ[GEL,6]
Else
If SHOT(GEL,0)
Draw SHOT(GEL,7),SHOT(GEL,8) To SHOT(GEL,10),SHOT(GEL,11)
End If
End If
Next T
Wait Vbl
Copy SOURCEA,SOURCEA+PSIZE To DESTA
Copy SOURCEB,SOURCEB+PSIZE To DESTB
Copy SOURCEC,SOURCEC+PSIZE To DESTC
Copy SOURCED,SOURCED+PSIZE To DESTD
Loop
'
Procedure UDATEOBJ[N]
PC=OBJ(N,9)
Gosub PC+0
OBJ(N,9)=PC
Pop Proc
'
'MOUNTAIN
'========
0 X=OBJ(N,1) : Z=OBJ(N,3)
OBJ(N,5)=((DPH*(X-30))/(DPH+Z)+185)*100
OBJ(N,6)=((DPH*(X+30))/(DPH+Z)+135)*100
OBJ(N,7)=(DPH*100)/(DPH+Z)+140 : PC=1
OBJ(N,0)=True
'main:
1 Return
'
'FLYING SAUCER
'=============
100 X=OBJ(N,1) : Z=OBJ(N,3) : Y=40-Rnd(20) : Gosub INIT3D
VELOC=Rnd(1000)+100 : OBJ(N,11)=(VELOC*DPH)/(DPH+Z)
If Rnd(1) Then OBJ(N,11)=-OBJ(N,11)
OBJ(N,0)=True : PC=101
'main:
101 Add OBJ(N,5),OBJ(N,11),-5000 To 37000
OBJ(N,6)=OBJ(N,5)+OBJ(N,4)
If OBJ(N,0)<1 Then Return
OBJ(N,0)=True : Add OBJ(N,8),8 : PC=102 : Return
102 Add OBJ(N,8),4 : PC=103 : Return
103 Add OBJ(N,8),-12 : Goto 100
'
'LANDING SAUCER
'==============
200 Y=-300 : Z=OBJ(N,3) : X=20-Rnd(40) : Gosub INIT3D
OBJ(N,6)=OBJ(N,5)+OBJ(N,4) : OBJ(N,11)=202 : PC=201
OBJ(N,0)=True
'main:
201 If OBJ(N,0)=1 Then Goto 210
Goto OBJ(N,11)
202 Add OBJ(N,7),2 : If OBJ(N,7)>180 Then OBJ(N,11)=203 : LANDED=True
Return
203 If Rnd(25)=0 Then OBJ(N,11)=204 : LANDED=False
Return
204 Add OBJ(N,7),-2 : If OBJ(N,7)<-50 Then PC=205
Return
205 If Rnd(100)=0 Then PC=200
Return
210 OBJ(N,0)=True : OBJ(N,8)=12 : PC=211 : Return
211 OBJ(N,8)=16 : PC=212 : Return
212 OBJ(N,8)=4 : OBJ(N,0)=0 : PC=205 : Return
'
'ALIEN
'=====
300 If Not LANDED Then Return
OBJ(N,7)=(DPH*100)/(DPH+175)+140 : OBJ(N,5)=OBJ(6,5)
OBJ(N,4)=(DPH*6000)/(DPH+175)-5000
OBJ(N,0)=True : PC=302 : LANDED=False
If Rnd(1) Then OBJ(N,11)=-1 Else OBJ(N,11)=1
302 Add OBJ(N,5),OBJ(N,11)*-100
If Abs(OBJ(N,5)-16000)>15000 Then OBJ(N,0)=0 : PC=300 : Return
OBJ(N,6)=OBJ(N,5)+OBJ(N,4)
Add OBJ(N,8),OBJ(N,11),24 To 27
If OBJ(N,0)<1 Then Return
OBJ(N,8)=27 : PC=303
303 Inc OBJ(N,8) : If OBJ(N,8)>35 Then PC=300 : OBJ(N,0)=0 : Goto 300
Return
'
INIT3D:
OBJ(N,5)=((DPH*(X-30))/(DPH+Z)+185)*100
OBJ(N,7)=(DPH*Y)/(DPH+Z)+140
OBJ(N,4)=(DPH*6000)/(DPH+Z)-5000
Return
End Proc
Procedure DRWOBJ[N,A]
O=OBJ(N,8)
Paste Bob OBJ(N,A)/100-SPT(O,0),OBJ(N,7)-SPT(O,1),O
End Proc
Procedure INITSHOT[N]
Add NXTSHOT,1,0 To 2 : SHOTDEL=8
X=0 : Y=75 : Z=0 : SHOT(N,0)=True : Shoot
SHOT(N,1)=X : SHOT(N,2)=Y : SHOT(N,3)=Z
SHOT(N,4)=(X Screen(X Mouse)-160)/5
SHOT(N,5)=(-Y Screen(Y Mouse)+10)/5
SHOT(N,6)=(DPH*(X-30))/(DPH+Z)+185
SHOT(N,7)=(DPH*(X+30))/(DPH+Z)+135
SHOT(N,8)=(DPH*Y)/(DPH+Z)+140
End Proc
Procedure UDATESHOT[N]
For T=6 To 8 : SHOT(N,T+3)=SHOT(N,T) : Next T
Add SHOT(N,1),SHOT(N,4) : Add SHOT(N,2),SHOT(N,5)
Add SHOT(N,3),25
X=SHOT(N,1) : Y=SHOT(N,2) : Z=SHOT(N,3)
SHOT(N,6)=(DPH*(X-30))/(DPH+Z)+185
SHOT(N,7)=(DPH*(X+30))/(DPH+Z)+135
SHOT(N,8)=(DPH*Y)/(DPH+Z)+140
If Z>1550 Then SHOT(N,0)=False
If Y>100 Then SHOT(N,0)=False : Boom
End Proc
Procedure INITVARS
For N=0 To OBJNUM-1
Read OBJ(N,10)
OBJ(N,9)=OBJ(N,10)*100
For T=1 To 3
Read OBJ(N,T)
Next T
Read OBJ(N,8)
Next N
For T=1 To BLTNUM
PTR=Sprite Base(T)
SPT(T,0)=Deek(PTR+6) : SPT(T,1)=Deek(PTR+8)
Next T
Data 0,80,100,550,1
Data 0,-200,100,250,2
Data 0,220,100,200,3
Data 1,-525,0,350,5
Data 1,-625,0,450,6
Data 1,-825,0,700,7
Data 2,0,0,150,4
Data 3,0,0,175,24
End Proc
Procedure INITSCREENS
Shared BGA,BGB,BGC,BGD,BGE
Shared SOURCEA,SOURCEB,SOURCEC,SOURCED
Shared DESTA,DESTB,DESTC,DESTD
BGA=Start(7) : BGB=BGA+8000 : BGC=BGB+8000
BGD=BGC+8000 : BGE=BGD+8000
Screen Open 0,320,200,4,Lowres : Flash Off : Colour 3,$F0 : RemScreen Hide
SOURCEA=Phybase(0) : SOURCEB=Phybase(1)
Screen Open 1,320,200,4,Lowres : Flash Off : Colour 3,$F0 : RemScreen Hide
SOURCEC=Phybase(0) : SOURCED=Phybase(1)
Screen Open 2,320,200,16,Lowres : Flash Off
DESTA=Phybase(0) : DESTB=Phybase(1)
DESTC=Phybase(2) : DESTD=Phybase(3)
Palette 0,$400,$5,$405
For T=0 To 15 : Read X : Colour T,X : Colour T+16,X : Next T
Data $300+$30,$300+$40,$300+$50,$300+$60
Data $400+$30,$400+$40,$400+$50,$400+$60
Data $500+$30,$500+$40,$500+$50,$500+$60
Data $600+$30,$600+$40,$600+$50,$600+$60
End Proc
Procedure SEQUENCE
GELS=0
For T=0 To OBJNUM-1
If OBJ(T,0)
SEQ(GELS)=OBJ(T,3)
Rol.l 8,SEQ(GELS)
Add SEQ(GELS),T+50
Inc GELS
End If
Next T
For T=0 To SHOTNUM-1
If SHOT(T,0)
SEQ(GELS)=SHOT(T,3)
Rol.l 8,SEQ(GELS)
Add SEQ(GELS),T
Inc GELS
End If
Next T
For T=GELS To 15
SEQ(T)=$7FFFFFFF
Next T
Sort SEQ(0)
End Proc